<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>

  <body>
    <script>
      /* 
      ------分数注意事项-----
      本次测试满分为100(最多100分), 有4道加分题; 答案不够完整或者有错误当题0分处理; 

      ------分数处理-----
      (0-60]: 不及格, 处理: 提供第二份不同试卷晚自习的时候重新考试, 并在第二天晚自习时间单独进行测试题提问(大部分都回答不上则采用手抄试卷方案);

      (60-75]: 良良, 处理: 晚自习时间单独进行测试题提问(大部分都回答不上则采用手抄试卷方案);

      (75-90]: 良好, 处理: 放你一马, 好好复习;

      (90-100]: 优秀, 处理: 好好好, 继续保持;
      */

      // 1.JS延迟加载的方式有哪些？（5）


      // 2.前端 JavaScript 中的 ECMAScript、DOM、BOM 的含义；（5）
      // ECMAScript: ECMA指定的一套标准，js基本的操作规范
      // DOM: 文档对象模型，主要是对DOM节点进行一系列的操作
      // BOM: 浏览器对象模型，主要实现浏览器特效方面

      // 4.如何进行数据类型的判断？（5）
      // typeof:  对数引用类型和null会判断为object， 对其他的判断类型准确
      // instanceof: 在数据类型的原型链中是否找到该类型的原型，只能正确判断引用数据类型，不能判断基本数据类型
      // Object.prototype.toString.call: 基本数据类型和引用数据类型都可以正确判断

      // 5.null 和 undefined 的区别？什么时候会得到 undefined？（5）
      // 区别：
      // null 为空值，表示空的对象引用地址（指针）（没有指向堆内的地址）
      // undefined 为空值，表示未定义的值，声明了变量但没有赋值

      // undefined出现场景
      // 1、声明了变量但没有赋值
      // 2、访问了对象里不存在的属性
      // 3、函数存在形参，但没有传入实参
      // 4、void对表达式进行求值

      // 6.如何理解 null == undefined 返回 true，null === undefined 返回 false？（5）
      // == 只对比值
      // null和undefined都为空值，值一致，因此为true

      // ===不仅对比值，同时对比数据类型
      // null的数据类型为null，undefined的数据类型为undefined，即使值相同也不能完全相等，因此为false

      // 7.使用 continue 或 break 终止循环时，两种方式的区别是？（5）
      // continue: 跳出当前循环条件
      // break: 中断整个循环

      // 8.如何判断字符串内是否包含指定字符？（5）
      // let str = "123"
      // str.indexOf("2");  : 在字符串里从头开始检索指定字符，若有此字符，返回对应下标；若无，则返回-1
      // str.lastIndexOf("4");  : 在字符串里从末尾开始检索指定字符，若有此字符，返回对应下标；若无，则返回-1
      // str.includes("3");  : 在字符串里检索指定字符，若有此字符，返回true；若无，则返回false

      // 9.请尽量列举出数组的方法，并且注明哪些方法会修改原数组，哪些不会；（5）
      // Array.isArray()：不会修改原数组
      // concat()： 不会
      // join()：不会
      // reverse()：不会
      // slice()：不会
      // splice()：会
      // indexOf()：不会
      // lastIndexOf()，不会
      // includes()：不会
      // find()：不会
      // findIndex()：不会
      // pop()：会
      // push()：会
      // shift()：会
      // unshift()：会
      // forEach()：不会
      // map()：不会
      // filter()：不会
      // every()：不会
      // some()：不会
      // sort()：，会
      // reduce()：不会

      // 10. 请写出下面语句的输出结果：（5）
      // let bar = true, number = 0;
      // console.log(bar + 0); //1
      // console.log(bar + "xyz");//truexyz
      // console.log(bar + true);//2
      // console.log(+true);//1
      // console.log(!'bluej');//false
      // console.log(number++);//0
      // console.log(++number);//2
      // console.log(number);//2

      // 11. 根据用户输入时间实现倒计时，输入时间格式错误时要有错误提示（5）
      // window.prompt("请输入目标时间");
      // let t = new Date(window.prompt("请输入目标时间")).getTime();

      // 12.输出从小到大排序好的五个不重复的随机"素数",范围[10-58)；（10）
      // 质数也叫素数是指在大于1的自然数中，除了1和它本身以外不再有其他因数的自然数，不能被任何整数整除的数。

      // 13.把下面数组成员排序打乱；（5）
      let arr13 = [10, 20, 30, 40, 50, 60];
      let newArr2 = []; // 打乱之后的数组


      // 14. 将多个数组进行去重合并；（10）
      // let arr140 = [1, 2, 3],
      //   arr141 = [2, 3, 4, 5];
      // let arr142 = arr140.concat(arr141)
      // let arr143 = arr142.filter(function(value,index,arr){
      //   return arr.indexOf(value) === index
      // })
      // console.log(arr143);

      // 15. 找出数组 arr=[1, 2, 3, "a", 4, "a", 2, 4, "a"] 中重复出现过的元素,并用数组将重复元素装起来输出,并且统计每个元素出现的次数（10）

      let arr15 = [1, 2, 3, 'a', 4, 'a', 2, 4, 'a'];
      let obj = {};
      let n = 0;
      let res = arr15.filter(function(value,index,arr){
          return arr.indexOf(value)!==index
          
        })
      for(const k of arr15){
        if(arr15.indexOf(k)===k){
          n+=1;
        }
       obj.key=k,obj.value = n
      }
      console.log(res);
      console.log(obj);

      // 16. 找出数组中年龄小于18岁的女生的信息重新组成新的数组,并且将她们count变为现有的平方（10）
      let arr16 = [
        {
          name: '111',
          sex: 'boy',
          age: 18,
          count: 20,
        },
        {
          name: '222',
          sex: 'girl',
          age: 17,
          count: 30,
        },
        {
          name: '333',
          sex: 'boy',
          age: 16,
          count: 40,
        },
        {
          name: '444',
          sex: 'girl',
          age: 15,
          count: 50,
        },
        {
          name: '555',
          sex: 'boy',
          age: 20,
          count: 60,
        },
        {
          name: '666',
          sex: 'girl',
          age: 13,
          count: 70,
        },
        {
          name: '777',
          sex: 'boy',
          age: 14,
          count: 80,
        },
      ];
      // let arr17 = [];
      // for(const k of arr16){
      //   if(k.age<18){
      //     arr17.push(k);
      //   }
      // }
      // for(const k of arr17){

      //   k.count *=k.count
      // }
      // console.log(arr17);

      // 17. 实现一个深克隆函数 (加分题 5)
      let obj17={
        a: 1,
        arr17: [1,2],
        o:{
          b:2
        }
      }
      function fn17(v){
        let p = Array.isArray(v)?[]:{};
        if(v instanceof Function)p=v;
        for(const key in v){
          if(v[key]instanceof Object){
            p[key]=fn17(v[key])
          }else{
            p[key]=v[key]
          }
        }
        return p
      }
      let obj18 = null;
      obj18 = fn17(obj17);
      obj18.a = 111;
      console.log('obj18',obj18);
      console.log('obj17',obj17);

      // 18. 实现一个数组的reduce方法 (加分题 5)

      // 19. 写出强制转换的方法有哪些 (加分题 5)
      String()
      Number()
      Boolean()
      toString()


      // 20. 如何判断一个对象是否为空对象的3种方法 (加分题 5)
    </script>
  </body>
</html>
